// 1. extends: 子类继承父类， es6的技术
/* // 父类
class Person {
  name = "老汉儿"
}

// 子类：
class Son extends Person{

  isChild = true
}

// 孙子类
class Student extends Son{
  sid=1;
}


let s = new Student();
console.log(s);
console.log(s.sid);
console.log(s.isChild);
console.log(s.name);

// s-> Son ->  Person-> Object */

// 继承--call() apply()

// 语法： 父对象.call(子对象，参数1，参数2,...,参数n)
// 语法： 父对象.apply(子对象，[参数1，参数2,...,参数n]), 只有2个参数，参数2是一个数组

// 所有飞机的原型
// 父类(构造函数)
function Plane(width, height, x,y){
  debugger
  this.width = width;
  
  this.height = height;
  this.x = x;
  this.y = y;

  this.create=function(){
    console.log("创建一个飞机");
  }
  this.create();
  console.log(this);  // PlayerPlane实例化对象
}

// 玩家飞机：
// 子类(构造函数)
function PlayerPlane(width, height, x,y){

  // 构造函数中的this,当使用new 运算符实例化一个对象时，this指向当前的实例化对象。
  // 在执行call，apply方法时，把子类的实例化对象通过call,apply方法，传给父类里面的this.
  // call，apply方法在执行时，会依次执行父类所有代码。
  // 在父类中，就相当于给this指向的实例化对象动态的添加了属性和方法。
  // 所以，call()，实现了给实例化对象，动态的添加属性(方法)，从而实现了属性的继承。 
  Plane.call(this,width, height, x,y)
  this.speed=1;
  console.log(this);  // PlayerPlane实例化对象
}

// let m1 = new PlayerPlane(50,60,100,500)
// console.log(m1);

// 敌机小飞机
// 子类(构造函数)

function SmallPlane(width, height, x,y){
  // 和call方法一样，调用时，传参数1这个实例化给父类中this,依次执行父类中的代码，给实例化对象动态扩展属性，从而实现继承属性的功能。
  // apply与call的区别，就是参数语法不同
  // apply,call方法，都是传子类对象去替换父类中的this,有时我们也把这种继承的方法，叫this的欺骗来实现继承。
  Plane.apply(this,[ width, height, x,y])
  this.speed=1;
  this.move=function(){
    console.log('走你~~~');
  }
  console.log(this); 
}

let s1 = new SmallPlane(50,60,100,500)
console.log(s1);